package com.example.tuter.activity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;

import androidx.appcompat.app.ActionBar;

import com.example.tuter.MainActivity;
import com.example.tuter.R;
import com.example.tuter.entity.Message;
import com.example.tuter.entity.UserInfo;
import com.example.tuter.exception.NetworkException;
import com.example.tuter.util.Constant;
import com.example.tuter.util.SPUtils;
import com.example.tuter.util.ToastUtil;
import com.example.tuter.util.httpUtil.HttpCodeConstant;
import com.example.tuter.util.httpUtil.HttpFunction.UserAPI;
import com.example.tuter.util.httpUtil.RetrofitFactory;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/**
 * 欢迎界面，该界面加载图标，检测token是否过期。是否需要重新登录。
 */
public class WelcomingActivity extends BaseActivity {
    private static final String TAG = WebViewActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.hide();
        }
        //发起网络请求，验证token有效性，并且更新token
        //初始化网络框架
        //本地token有效，初始化用户信息
        //SharedPreferencesUtil.clear(this);

        //同步初始化，保证比别的请求要快，否则会空指针
        Constant.r = RetrofitFactory.getBaseInstance();
        //开一个子线程去完成相关工作
        new Thread(() -> {
            initInfo();
            //登录检测
            checkLoginState();
        }).start();


    }

    @Override
    protected void onResume() {
        super.onResume();
        //发出网络请求验证用户身份
        UserAPI userAPI = Constant.r.create(UserAPI.class);
        if (Constant.schoolCookie != null) {
            Call<Message<UserInfo>> call = userAPI.checkUser(Constant.schoolCookie);
            call.enqueue(new Callback<Message<UserInfo>>() {
                @Override
                public void onResponse(Call<Message<UserInfo>> call, Response<Message<UserInfo>> response) {
                    Message<UserInfo> message = response.body();
                    if (message == null) this.onFailure(call, new NetworkException("网络错误"));
                    UserInfo user = message.getData();
                    if (user != null) {
                        SPUtils.putUserInfo(WelcomingActivity.this, user);

                        //跳转主页
                        Intent intent = new Intent(WelcomingActivity.this, MainActivity.class);
                        startActivity(intent);
                        finish();
                    } else {
                        this.onFailure(call, new NetworkException("网络错误,验证用户失败"));
                    }
                }

                @Override
                public void onFailure(Call<Message<UserInfo>> call, Throwable t) {
                    ToastUtil.showToastShort(TAG,t.getMessage());
                }
            });
        }

    }

    @Override
    protected void initData() {

    }

    @Override
    protected void bindEvent() {

    }

    @Override
    protected void initView() {

        setContentView(R.layout.activity_welcoming);

    }

    @Override
    protected int getLayoutID() {
        return R.layout.activity_welcoming;
    }

    /**
     * 初始化用户信息，读入用户信息等等。
     */
    private void initInfo() {
        /**
         * 用户第一次登录的话，没有token，登录学校信息门户后，cookie和token都有了。这时候大部分接口都能正常使用
         *         当用户不是第一次登录时，这时候读取到的cookie可能过期了，当从本地获取到这个cookie后，尝试请求学校的接口，并验证是否过期。
         *         如果过期了，提示用户已经过期，但不强制用户重新登录信息门户，但是提供用户重新登录的按钮
         */


        Constant.userInfo = SPUtils.getUserInfo(this);

        Constant.schoolCookie = SPUtils.getSchoolCookie(this);

        Constant.token = SPUtils.getToken(this);

        Constant.CUR_SEMESTER = SPUtils.getCurSemester(this);

        Constant.CUR_WEEKS = SPUtils.getCurWeek(this);


        log();

    }

    private void log() {
        Log.d(TAG, "schoolCookie: " + Constant.schoolCookie);
        Log.d(TAG, "userToken: " + Constant.token);
    }

    /**
     * 从本地读入并发送检测token是否有效
     *
     * @return
     */
    private void checkLoginState() {
        //从本地获取token，与后端交互验证token是否生效
        String token = SPUtils.getToken(this);
        if ("".equals(token)) {
            startActivity(new Intent(WelcomingActivity.this, WebViewActivity.class));// 登录主页
        }

        Call<Message<UserInfo>> call = Constant.r.create(UserAPI.class).getUserInfo();

        call.enqueue(new Callback<Message<UserInfo>>() {
            @Override
            public void onResponse(Call<Message<UserInfo>> call, Response<Message<UserInfo>> response) {
                try {

                    Message<UserInfo> body = response.body();
                    if (body != null && body.getCode() == HttpCodeConstant.SUCCESS.getValue()) {
                        //token有效,更新本地userInfo，更新
                        SPUtils.putUserInfo(WelcomingActivity.this, body.getData());
                        startActivity(new Intent(WelcomingActivity.this, MainActivity.class));// 主页
                        finish();
                    } else {
                        Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                //跳转登录
                                Intent intent = new Intent(WelcomingActivity.this, WebViewActivity.class);
                                startActivity(intent);
                            }
                        }, 2000);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<Message<UserInfo>> call, Throwable t) {
                ToastUtil.showToastLong(TAG,"网络错误，请稍后再试");
            }
        });

    }


}